<?php
/**
 * Project:     itoFW: Ito PHP Framework
 * File:        itoLoader.php
 *
 * This file contains class and one silly function for system's objects loading.
 * Like: libs, components, modules and bots.
 * 
 * @package itoFW
 * @version 1.0.0
 * @changes none
 */
//Uztikrinimas, kad failas gali buti leidziamas tik per indes.php ar ajaxCall.php
if (!defined('_ito_sys')) die('Neturite leidimo perziureti sia svetaines dali.');

/**
 * System objects loader class
 *
 */
class loaderClass {
    var $_reg = array(); //Array wich holds objects registr
 
    /**
     * Loader
     *
     * @param bool $directCall
     * @return loaderClass
     */
    function loaderClass($directCall=true) {
        if ($directCall) {
            trigger_error("loaderClass yra singleton!", E_USER_ERROR);
        }
    }
 
    /**
     * Get loaderClass instance.
     * 
     * Returns class instance. This is used cose this class is based on Singleton pattern.
     *
     * @return mix
     */
    function &getInstance() {
        static $instance;
        if (!is_object($instance)) {
            $instance = new loaderClass(false);
        }
        return $instance;
    }
 
    /**
	 * Lib arba Com objektu loaderis
	 *
 	* @param string $typeItem Objekto tipas ir pavadinimas: tipas_pavadinimas
 	* @return unknown
 	*/
	function loadIt($typeItem /*type_item*/) {
	
		//Patikrinimas kokio tipo duomenys paduoti per $typeItem. Kadangi f-ja
		//getSystemObj duoda jau suformuotus duomenis array.
		if (is_string($typeItem)) { $typeItem = $this->getItemType($typeItem); }
	
		switch ($typeItem['type']) {
			case 'com':
				$obj = $this->loadCom($typeItem['item']);
			break;
			case 'lib':
				$obj = $this->loadLib($typeItem['item']);
			break;
		}
	
		$this->_reg[$typeItem['type']] = $obj;
	
		return $obj;
	}
	
	/**
 	* Sisteminio objekto grazinimas.
 	*
 	* @param string $typeItem Objekto tipas ir pavadinimas: tipas_pavadinimas
 	* @param bool $load Nurodymas ar reikia sukurti objekta jei jis neuzregistruotas registre.
 	* @return mix
 	*/
	function getSystemObj($typeItem, $load=true) {
		$typeItem = $this->getItemType($typeItem);
		$item = '';
		if (array_key_exists($typeItem['type'],$this->_reg)) {
			if (array_key_exists($this->_reg['item'],$this->_reg[$typeItem['type']])) {
				$item = $this->_reg[$typeItem['type']][$typeItem['item']];
			}
		}
		
		$obj = '';
	
		if ( $item != null && $item != '' ) {
			$obj = $item;
		} elseif ($load) {
			$obj = $this->loadIt($typeItem);
		}
	
		return $obj;
	}
	
	/**
 	* Patikrina objekto tipo egzistavima
 	*
 	* @param string $type
 	* @return bool
 	* @access private
 	*/
	function chekType($type) {
		if ($type != 'com' & 'lib') {
			return false;
		} else {
			return true;
		}
	}
	
	/**
 	* Objekto tipo ir pavadinimo patikrinimas
 	*
 	* @param string $typeItem
 	* @return array
 	* @access private
 	*/
	function getItemType($typeItem) {
		$data = array('type'=>'','item'=>'');
	
		$tData = explode('_',$typeItem);
		$tDataCnt = count($tData);
	
		if ($tDataCnt < 2) {
			//Veliau cia reikia ikisti error reportinima
			die('Neteisingai pateiktas objekto Tipas ir Objekto pavadinimas: '.$typeItem);
		}
	
		if ($this->chekType($tData[0])) {
			$data['type'] = $tData[0];
		} else {
			//Veliau cia reikia ikisti error reportinima.
			die('Neegzistuoja toks objekto tipas: '.$tData[0]);
		}
	
		$data['item'] = $tData[1];
	
		return $data;
	}
	
	/**
 	* Sisteminiu biblioteku loaderis
 	*
 	* @param string $name Bibliotekos pavadinimas
 	* @return mix
 	*/
	function loadLib($name) {
		$obj = null;
		$objFile = getConf('dir_libs').'/'.$name.'.lib.php';
	
		if (!file_exists($objFile)) {
			//Veliau cia reikia iterpti klaidu apdorojimo sistema.
			die('Neegzistuoja biblioteka: '.$objFile);
		}
	
		require_once($objFile);
	
		if (function_exists($name.'Loader')) {
			$obj = call_user_func($name.'Loader');
		}
	
		return $obj;
	}
	/**
	 * Komponento loaderis
	 *
	 * @param string $name Komponento pavadinimas
	 * @return mix Komponento objektas
	 * 
	 * @todo Apgalvoti, kad gal galima grazinti ne komponento objekta, o tik duomenis is jo.
	 */
	function loadCom($name) {
		$obj = null;
		
		if (file_exists(getConf('dir_components').'/com_'.$name.'/'.$name.'.php')) {
			require_once(getConf('dir_components').'/com_'.$name.'/'.$name.'.php');
			//die(getConf('dir_components').'/com_'.$name.'/'.$name.'.php');
			
			if (class_exists($name.'Controler')) {
				$classname = $name.'Controler';
				$obj = new $classname;
			} else {
				//Iterpti error handlinima
				die('Neegzistuoja komponento '.$name.' iskvietimo class '.$name.'Controler');
			}
		} else {
			//Iterpti error handlinima
			die('Neegzistuoja komponentas '.getConf('dir_components').'/com_'.$name.'/'.$name.'.php');
		}
		
		return $obj;
	}
	
}

/**
 * Lazy loader function
 *
 * @param string $typeItem
 * @param bool $load
 * @return mix
 */
function loadIt($typeItem, $load=true) {
	$obj = loaderClass::getInstance();

	return $obj->getSystemObj($typeItem,$load);
}
?>